// 所有和用户相关的action

import {
  UserPhotoResponse,
  UserProfile,
  UserProfileResponse,
  UserResponse,
} from '@/types/data';
import { RootThunkAction } from '@/types/store';
import { http } from '@/utils/http';

// 用户信息返回类型
// type UserResponse = {
//   message: string;
//   data: User;
// };

// 获取user信息
export const getUser = (): RootThunkAction => {
  // 返回的是函数
  return async (dispatch) => {
    // 1 请求数据（api 没有好）
    const res = await http.get<UserResponse>('/user');
    console.log('获取用户返回值', res.data.data);

    // 2 处理数据或者直接交给reducer
    // dispatch
    dispatch({ type: 'user/getUser', payload: res.data.data });
  };
};

// 获取用户描述信息
export const getUserProfile = (): RootThunkAction => {
  return async (dispatch) => {
    // 1 发起请求
    const res = await http.get<UserProfileResponse>('/user/profile');
    console.log('user profile', res.data.data);

    // 把数据交给reducer
    dispatch({ type: 'user/getUserProfile', payload: res.data.data });
  };
};

// 更新用户描述信息

// 鼠标放到 tt 上观看 生成可选属性类型
// type tt = Partial<UserProfile>
export const updateUserProfile = (
  userProfile: Partial<UserProfile>
): RootThunkAction => {
  return async (dispatch) => {
    // 更新用户信息
    const res = await http.patch('/user/profile', userProfile);
    console.log('update=======>', res);

    // 如果上面产生异常，下面的代码也不会走，也不会更新页面的显示
    // 但是从用户体验的角度，给用户良好的额提示。

    // 更新本地用户信息
    dispatch({ type: 'user/updateProfile', payload: userProfile });
  };
};

// 更新用户头像
export const updateUserPhoto = (file: FormData): RootThunkAction => {
  return async (dispatch) => {
    // 发起请求
    const res = await http.patch<UserPhotoResponse>('/user/photo', file);
    console.log('头像上传res', res);

    // 更新 reducer
    dispatch({
      type: 'user/updateProfile',
      payload: { photo: res.data.data.photo },
    });
  };
};
